home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / obasic.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  10KB  |  398 lines

  1. /* --------------------------------- obasic.c ------------------------------- */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* Dynamics of the Basic plane.
  8. */
  9.  
  10. #include "plane.h"
  11.  
  12.  
  13. extern void FAR
  14. dynamics_basic (OBJECT *p, int action)
  15. {
  16.     POINTER    *ptr;
  17.     int    onground, taxiing;
  18.     int    t, v, vmag, weight, force, drag, acc, lift, q, qf;
  19.     int    rho, sos, Cd, Cl, Cdp, Cds, Cdg, Cdi, FEff, sina;
  20.     long    tt;
  21.     ANGLE    alpha, beta, stall, a;
  22.     VECT    AA;
  23.     AVECT    da;
  24.  
  25.     if (action)
  26.         return;
  27.  
  28.     if (dynamics_input (p))
  29.         return;
  30.  
  31.     ptr = p->pointer;
  32.  
  33.     onground = EX->flags & PF_ONGROUND;
  34.     EX->flags &= ~PF_GLIMIT;
  35.  
  36.     AA[X] = -fmul (GACC, p->T[X][Z]);    /* gravity */
  37.     AA[Y] = -fmul (GACC, p->T[Y][Z]);
  38.     AA[Z] = -fmul (GACC, p->T[Z][Z]);
  39.  
  40.     EX->Gforce = -AA[Z];        /* pilots gravity */
  41.     v = EX->v[Y];
  42.  
  43.     t = muldiv (EP->pitch_rate, EX->elevators, 100);
  44.     t = muldiv (t, v, 150*VONE);
  45.     dampen (&p->da[X], t, EP->opt[1]);
  46.  
  47.     t = -muldiv (EP->roll_rate,  EX->ailerons, 100);
  48.     t = muldiv (t, v, 150*VONE);
  49.     dampen (&p->da[Y], t, EP->opt[1]);
  50.  
  51.     if (onground ? check_takeoff (p) : check_land (p)) {
  52.         p->flags |= F_HIT;
  53.         return;
  54.     }
  55.  
  56.     taxiing = onground && p->speed < 40*VONE;    /* NWS */
  57.  
  58.     if (100 == EX->throttle) {
  59.         t = EP->ab_thrust - EP->mil_thrust;
  60.         t = EP->mil_thrust + muldiv (EX->afterburner, t, 100);
  61.     } else
  62.         t = muldiv (EX->throttle, EP->mil_thrust, 100);
  63.     if (t < 0) {
  64.         if (onground)
  65.             t /= 2;        /* reverse thrust is 50% efficient? */
  66.         else
  67.             t = 0;
  68.     }
  69.     dampen (&EX->thrust, t, 8);
  70.     EX->power = muldiv (EX->thrust, 10000, EP->ab_thrust);
  71.  
  72.     t = EX->afterburner ? EP->ab_sfc : EP->mil_sfc;
  73.     t = muldiv (iabs(EX->thrust), t, 60*60/10);
  74.     EX->fuelRate = t;
  75.     EX->fuel -= TADJ(t);
  76.     if (EX->fuel < 0) {
  77.         EX->fuel = 0;
  78.         EX->thrust = 0;
  79.     }
  80.     if (onground && 0 == p->speed && 0 == EX->thrust)
  81.         supply (p, 0);
  82.  
  83.     force = fmul (EX->thrust*2, FCON(0.453*9.8/VONE*5));    /* N*VONE */
  84.     tt = EP->weight + EX->fuel/100;                /* lb */
  85.     weight = fmul ((int)(tt/VONE), FCON (0.453));        /* Kg*VONE */
  86.     if ((t = EX->stores[WE_M61-1]) > 0)
  87.         weight += (int)(t * st.bodies[O_M61]->shape->weight/1000/VONE);
  88.     if ((t = EX->stores[WE_MK82-1]) > 0)
  89.         weight += (int)(t * st.bodies[O_MK82]->shape->weight/1000/VONE);
  90.     acc = muldiv (force, VONE, weight);
  91. CCshow (p, 0, "thrust", (long)force);
  92. CCshow (p, 0, "weight", (long)weight);
  93. CCshow (p, 0, "thrA", (long)acc);
  94.  
  95.     if (taxiing) {
  96. CCshow (p, 0, "vold", (long)p->speed);
  97.         p->speed += TADJ(acc);                /* v */
  98. CCshow (p, 0, "vnew", (long)p->speed);
  99.         drag = EP->wheel_mu
  100.             + muldiv (EP->brake_mu-EP->wheel_mu, EX->brake, 100);
  101.         drag = TADJ(fmul (drag, GACC));
  102. CCshow (p, 0, "drag", (long)drag);
  103.         if (p->speed > drag)
  104.             p->speed -= drag;
  105.         else if (p->speed < -drag)
  106.             p->speed += drag;
  107.         else
  108.             p->speed = 0;                /* stop! */
  109. CCshow (p, 0, "v", (long)p->speed);
  110.  
  111.         p->da[X] = (EP->gpitch - p->a[X])/VONE;
  112.         p->da[Y] = -p->a[Y]/VONE;
  113.  
  114.         EX->v[X] = 0;
  115.         EX->v[Y] = fmul (p->speed,  p->cosx);
  116.         EX->v[Z] = fmul (p->speed, -p->sinx);
  117. CCshow (p, 0, "vy", (long)EX->v[Y]);
  118. /* 60 degrees/sec at full rudder when doing 10 m/sec.
  119. */
  120.         t = muldiv (DEG(60)/VONE, EX->rudder, 100);
  121.         p->da[Z] = muldiv (t, p->speed, 10*VONE);
  122.         airdata (p->R[Z], 0, 0, 0, &sos);
  123.     } else {
  124.         if (v) {
  125.             alpha = -ATAN (EX->v[Z], v);
  126.             if (alpha > D90)            /* temp */
  127.                 alpha = D90;
  128.             else if (alpha < -D90)
  129.                 alpha = -D90;
  130.         } else
  131.             alpha = 0;
  132.         EX->aoa = alpha;
  133. /*        p->da[X] -= alpha/64;*/
  134.  
  135.         t = ihypot2d (EX->v[Y], EX->v[Z]);
  136.         beta = t ? ATAN (EX->v[X], t) : 0;
  137. #if 1
  138.         p->da[Z] = muldiv (p->speed, EX->rudder, 100*VONE);
  139.         p->da[Z] -= beta/VONE;
  140.         AA[X] -= EX->v[X]/2;
  141. #endif
  142. #if 0
  143.         p->da[Z] = muldiv (p->speed, EX->rudder, 100*VONE);
  144.         p->da[Z] -= beta/VONE;
  145. #endif
  146. #if 0
  147.         AA[X] = -muldiv (p->speed, EX->rudder, 16*VONE);
  148.         AA[X] -= EX->v[X] / (4*VONE);
  149.         p->da[Z] = -beta/(VONE/2);
  150. #endif
  151.  
  152.         EX->flags &= ~PF_STALL;
  153. #if 0
  154.         stall = DEG2ANG(25);
  155.         stall -= muldiv (EP->MaxFlaps, EX->flaps, 8*100);
  156.         if (alpha > D90/4) {
  157.             t = (stall-alpha)/VONE/4;
  158.             if (p->da[X] > t)
  159.                 p->da[X] = t;
  160.             EX->flags |= PF_STALL;
  161.             if (!(EX->flags & PF_NOSTALL)) {
  162.                 if (alpha > stall/2*3)
  163.                     alpha = 0;
  164.                 else
  165.                     alpha = (stall/2*3-alpha)*2;
  166.             } else
  167.                 alpha = stall;
  168.         } else if (alpha < -stall) {
  169.             t = (-stall-alpha)/VONE/4;
  170.             if (p->da[X] < t)
  171.                 p->da[X] = t;
  172.             EX->flags |= PF_STALL;
  173.             if (!(EX->flags & PF_NOSTALL)) {
  174.                 if (alpha < -stall/2*3)
  175.                     alpha = 0;
  176.                 else
  177.                     alpha = (-stall/2*3-alpha)*2;
  178.             } else
  179.                 alpha = -stall;
  180.         }
  181. #else
  182.         stall = 0;    /* avoid compiler warning */
  183. #endif
  184.         airdata (p->R[Z], 0, 0, &rho, &sos);
  185. CCshow (p, 3, "rho", (long)fmul(rho, 1000));
  186. CCshow (p, 0, "sos", (long)sos/VONE);
  187.  
  188. #if 0
  189.         a = alpha + muldiv (EP->MaxFlaps, EX->flaps, 4*100);
  190. #else
  191.         FEff = FCON(0.5);
  192.         a = alpha + fmul (FEff, muldiv (EP->MaxFlaps, EX->flaps, 100));
  193. #endif
  194.         sina = SIN (a);
  195. CCshow (p, 2, "aoa", (long)ANG2DEG00 (alpha));
  196. CCshow (p, 2, "aeff", (long)ANG2DEG00 (a));
  197.         t = fdiv (EP->wing_area,
  198.             muldiv (EP->wing_span, EP->wing_span, VONE));
  199.         t = fmul (t, FCON(1.0/C_PI));
  200. CCshow (p, 3, "t", (long)fmul(t, 1000));
  201.  
  202. /* the '/4' and (later) '*4' are to evoid overflow. Fractionc are limited
  203.  * to the range [-2...+2].
  204. */
  205.         Cl  = muldiv (sina, FONE/4, FCON(.17) + t);
  206.         Cdi = fmul (Cl, t*4);
  207.         Cdi = fmul (Cdi, Cl)*4;
  208.         Cdi = muldiv (Cdi, 100, EP->efficiency_factor);
  209.         Cdp = FCON(0.05);        /* parasitic */
  210.         Cds = FCON(0.50);        /* speed brakes */
  211.         Cdg = FCON(0.10);        /* gear */
  212. CCshow (p, 3, "Cl", (long)fmul(Cl, 1000));
  213. CCshow (p, 3, "Cdi", (long)fmul(Cdi, 1000));
  214. CCshow (p, 3, "Cdp", (long)fmul(Cdp, 1000));
  215.         vmag = iabs(p->speed/VONE);
  216.         q = muldiv (vmag, vmag, 128);
  217.         q = fmul (rho, q);
  218.         if (q < VMAX/128) {
  219.             q = fmul (rho, vmag) * vmag;
  220.             qf = 1;
  221.         } else
  222.             qf = 128;
  223.  
  224. /* VONE is internal force factor
  225. */
  226.         if (EP->wing_area > 2*VONE*2*VONE) {
  227.             q = muldiv (q, EP->wing_area, 2*VONE*32*VONE);
  228.             qf *= 32;
  229.         } else {
  230.             q = muldiv (q, EP->wing_area, 2*VONE*2*VONE);
  231.             qf *= 2;
  232.         }
  233. CCshow (p, 0, "q", (long)q);
  234. CCshow (p, 0, "qf", (long)qf);
  235.         drag = fmul (q, Cdi);
  236. CCshow (p, 0, "Di", (long)drag);
  237.         Cd = Cdp;
  238. CCshow (p, 3, "Cdp", (long)fmul(Cd, 1000));
  239.         if (EX->airbrake)
  240.             Cd += muldiv (Cds, EX->airbrake, 100);
  241. CCshow (p, 3, "+Cds", (long)fmul(Cd, 1000));
  242.         if (EX->equip & EQ_GEAR)
  243.             Cd += Cdg;
  244. CCshow (p, 3, "+Cdg", (long)fmul(Cd, 1000));
  245.         drag += fmul (q, Cd);
  246. CCshow (p, 0, "dragF", (long)drag);
  247.         drag = muldiv (drag, VONE*qf, weight);
  248. CCshow (p, 0, "dragA", (long)drag);
  249.         if (v >= 0)
  250.             acc -= drag;
  251.         else
  252.             acc += drag;
  253. CCshow (p, 0, "acc", (long)acc);
  254.  
  255.         lift = muldiv (fmul (q, Cl), EP->opt[3], 4);
  256. CCshow (p, 0, "liftF", (long)lift);
  257.         lift = muldiv (lift, VONE*qf*4, weight);
  258. CCshow (p, 0, "liftA", (long)lift);
  259.  
  260. #if 1
  261.         if (onground) {
  262.             t = p->speed - EP->liftoff_speed*VONE/2; /*nm->meter*/
  263.             if (t < 0 && p->a[X] <= EP->gpitch)
  264.                 t = 0;
  265.             if (p->da[X] > t)
  266.                 p->da[X] = (t - p->a[X])/VONE;
  267.             if (p->da[X] < 0 && p->a[X] <= EP->gpitch)
  268.                 p->da[X] = -p->a[X]/VONE;
  269.             p->da[Y] = -p->a[Y]/VONE;
  270.         }
  271. #else
  272.         if (onground) {
  273.             /* say torque is 1/4 of lift against 1/10 of the weight */
  274.             t = lift/2 + AA[Z]/5;
  275.             if (t < 0 && p->a[X] <= EP->gpitch)
  276.                 t = 0;
  277.             if (p->da[X] > t)
  278.                 p->da[X] = (t - p->a[X])/VONE;
  279.             if (p->da[X] < 0 && p->a[X] <= EP->gpitch)
  280.                 p->da[X] = -p->a[X]/VONE;
  281.             p->da[Y] = -p->a[Y]/VONE;
  282.         }
  283. #endif
  284.         if (onground) {
  285.             t = EP->wheel_mu + muldiv (EP->brake_mu-EP->wheel_mu,
  286.                             EX->brake, 100);
  287.             t = fmul (t, GACC);
  288.             if (abs (v) <= t) {        /* stop! */
  289.                 acc = 0;
  290.                 lift = 0;
  291.                 EX->v[X] = EX->v[Y] = EX->v[Z] = 0;
  292.             } else if (p->speed > 0)
  293.                 acc -= t;
  294.             else
  295.                 acc += t;
  296.         }
  297.  
  298. CCshow (p, 0, "G[Y]", (long)AA[Y]);
  299.         AA[Y] += acc;
  300. CCshow (p, 0, "AA[Y]", (long)AA[Y]);
  301.         AA[Z] += lift;
  302.  
  303.         if (onground)
  304.             EX->flags &= ~PF_STALL;
  305.         else {
  306.             EX->Gforce += AA[Z];
  307.             if (EX->Gforce > EP->max_lift)
  308.                 EX->flags |= PF_GLIMIT;
  309.             else if (EX->Gforce < EP->min_lift)
  310.                 EX->flags |= PF_GLIMIT;
  311.             if (EX->equip & EQ_GEAR) {
  312.                 t = ~1 & fmul (p->speed, FCON(0.02));
  313.                 t = t*t;
  314.                 AA[X] += TADJ(Frand()%(1+t) - t/2);
  315.                 AA[Y] -= TADJ(Frand()%(  t));
  316.                 AA[Z] += TADJ(Frand()%(1+t) - t/2);
  317.             }
  318.         }
  319.  
  320.         EX->v[X] += TADJ(AA[X]);
  321. CCshow (p, 0, "v[Y]", (long)EX->v[Y]);
  322.         EX->v[Y] += (t = TADJ(AA[Y]));
  323. CCshow (p, 0, "dv", (long)t);
  324. CCshow (p, 0, "v[Y]", (long)EX->v[Y]);
  325.         EX->v[Z] += TADJ(AA[Z]);
  326.         VMmul (p->V, EX->v, p->T);
  327. #if 0
  328.         if (onground && p->V[Z] < 0) {
  329.             p->V[Z] = 0;
  330.             VxMmul (EX->v, p->V, p->T);
  331.         }
  332. #endif
  333.         p->speed = ihypot3d (p->V);
  334.     }
  335.  
  336.     da[X] = TADJ(p->da[X])*VONE;
  337.     da[Y] = TADJ(p->da[Y])*VONE;
  338.     da[Z] = TADJ(p->da[Z])*VONE;
  339.  
  340.     Myxz (p->T, da);        /* rebuild from scratch */
  341.  
  342.     if (!taxiing) {
  343.         Vcopy (AA, EX->v);
  344.         VxMmul (EX->v, AA, p->T);
  345.     }
  346.  
  347.     fMroty (p->T, p->siny, p->cosy);
  348.     fMrotx (p->T, p->sinx, p->cosx);
  349.     fMrotz (p->T, p->sinz, p->cosz);
  350.     Mangles (p, p->T, p->a, da[Y]);
  351.  
  352. #if 0
  353.     if (onground && p->a[X] < EP->gpitch) {
  354.         p->a[X] = EP->gpitch;
  355.         Mobj (p);
  356.     }
  357. #endif
  358.     if (taxiing) {
  359.         VMmul (p->V, EX->v, p->T);
  360.         p->V[Z] = 0;
  361.     } else if (onground && p->V[Z] < 0) {
  362.         VECT    BB;
  363.  
  364.         AA[X] = AA[Y] = 0;
  365.         AA[Z] = p->V[Z];
  366.         VxMmul (BB, AA, p->T);
  367.         Vdec (EX->v, BB);
  368.         p->V[Z] = 0;
  369.         p->speed = ihypot3d (p->V);
  370.     }
  371.  
  372. #define MAX_SPEED    1000
  373.     if (p->speed > MAX_SPEED*VONE) {        /* temp */
  374.         t = muldiv (FONE, (int)(MAX_SPEED*VONE), p->speed);
  375.         EX->v[X] = fmul (t, EX->v[X]);
  376.         EX->v[Y] = fmul (t, EX->v[Y]);
  377.         EX->v[Z] = fmul (t, EX->v[Z]);
  378.         p->V[X]  = fmul (t, p->V[X]);
  379.         p->V[Y]  = fmul (t, p->V[Y]);
  380.         p->V[Z]  = fmul (t, p->V[Z]);
  381.         p->speed = ihypot3d (p->V);
  382.     }
  383.  
  384. /* Mach number.
  385. */
  386.     EX->mach = muldiv (p->speed, 1000, sos); /* good enough */
  387.  
  388. /* pull up warning time.
  389. */
  390.     t = muldiv (4000, iabs(p->speed), 300*VONE);
  391.     t = muldiv (t, iabs(p->a[X]), D90);
  392.     if (t < 2000)
  393.         t = 2000;
  394.     EX->misc[8] = t;
  395. }
  396.  
  397. #undef MAX_SPEED
  398.